import { ZipPos } from '@/modules/structureCache'

/**
 * 外矿任务
 */
export interface RemoteHarvestTask {
    /**
     * 外矿房间
     */
    roomName: string
    /**
     * 搬运工
     */
    remoteCarrier: string[]
    /**
     * 预定者
     */
    remoteReserver: string[]
    /**
     * 外矿守卫
     */
    remoteGuard: string[]
    /**
     * 是否是中央九房
     */
    isCenterNine?: boolean
    /**
     * 是否是中心房
     */
    isCenter?: boolean
    /**
     * 外矿数据
     */
    data: RemoteHarvestData
}

/**
 * 外矿能量矿信息
 */
export interface RemoteSourceInfo {
    x: number
    y: number
    remoteHarvester: string[]
    roads: {
        [roomName: string]: ZipPos[]
    }
    roadLength: number
    containerId?: Id<StructureContainer>
    // 矿的种类
    type: MineralConstant | RESOURCE_ENERGY
    // 什么时候再生
    timeToRegeneration?: number
}

/**
 * 外矿数据
 */
export interface RemoteHarvestData {
    // 能量矿+元素矿信息
    source: {
        [sourceId: Id<Source | Mineral>]: RemoteSourceInfo
    }
    // 重启时间，由于某些原因，外矿需要暂停（遭遇外敌，cpu 不够等等）
    restartTime?: number
    // 是否危险
    isDanger?: boolean
    // 无敌人状态持续时间
    duration?: number
    // 控制器周围的空闲点位，方便确定预定者的数量
    controllerFreePos: number
}

/**
 * 外矿 memory
 */
export interface RemoteHarvestMemory {
    /**
     * 外矿任务列表
     */
    tasks: RemoteHarvestTask[]
}

declare global {
    interface RoomMemory {
        remoteHarvest: RemoteHarvestMemory
    }

    interface Creep {
        /**
         * 当前 tick 是否进行了交头接耳
         */
        _talked?: boolean
    }
}
